#include "estructuras.h"
#include <time.h>
/*
 * Recibe Kanbans de PaintShop, solicita partes a Puertas, Cabina y Caja, lo arma, y lo devuelve a PaintShop
 */
int main(int argc, char *argv[])
{
	srand(time(NULL));
	char mensaje[500];
	m_kanbanproduccion msg_kproduccion;
	m_kanbanentreprocesos msg_kprocesos;

	int producidos, fentregar;
	int recibidosCaja, recibidosCabina, recibidosPuerta;

	int colaE, colaI, pid_Paintshop;
	key_t clave_colaE, clave_colaI;

	clave_colaE = ftok(DIRECTORIO, COLA_EXTERNA);
	clave_colaI = ftok(DIRECTORIO, COLA_INTERNA);

	if ( (colaE = msgget(clave_colaE, 0666)) < 0 )		/* Obtengo el ID de la cola */
	{
		sprintf(mensaje, "Error al obtener el ID de la cola Externa\n");
		write(fileno(stdout), mensaje, strlen(mensaje));
		exit(-1);
	}
	
	if ( (colaI = msgget(clave_colaI, 0666)) < 0 )		/* Obtengo el ID de la cola */
	{
		sprintf(mensaje, "Error al obtener el ID de la cola Interna\n");
		write(fileno(stdout), mensaje, strlen(mensaje));
		exit(-1);
	}

	while(1)
	{
		/* Recibo Kanban de Produccion de Paintshop*/
		if ( msgrcv(colaE, (m_kanbanproduccion *) &msg_kproduccion, sizeof(m_kanbanproduccion), MSG_ARMADO_PROD, 0) < 0 )
		{
			sprintf(mensaje, "Armado: Error al encolar el pedido en PaintShop Produccion\n");
			write(fileno(stdout), mensaje, strlen(mensaje));

			exit(-1);
		}

		printf("Armado: Recibi de Paintshop Kanban de Produccion\n");
		printf("Ventas: %d\n", msg_kproduccion.ventas);
		printf("sector: %d\n", msg_kproduccion.sector);
		printf("sectorSiguiente: %d\n", msg_kproduccion.sectorSiguiente);
		printf("cantVehiculos: %d\n", msg_kproduccion.cantVehiculos);
		printf("cantidad: %d\n", msg_kproduccion.cantidad);	
		printf("\n");

		pid_Paintshop = msg_kproduccion.sector;
		
		// le meto mi pid
		msg_kproduccion.sectorSiguiente = msg_kproduccion.sector;
		msg_kproduccion.sector = getpid();

		// verifico stock, si hace falta, hago pedido.
		
		// ENVIAR KANBAN PRODUCCION A CAJA
		sprintf(mensaje, "Envio KProd a CAJA\n");
		write(fileno(stdout), mensaje, strlen(mensaje));
		
		msg_kproduccion.mtype = MSG_CAJA_PROD;
		if ( msgsnd(colaI, (m_kanbanproduccion *) &msg_kproduccion, sizeof(m_kanbanproduccion), 0) < 0 )
		{
		        sprintf(mensaje, "Armado: Error al encolar el pedido de parte lista a Caja\n");
			write(fileno(stdout), mensaje, strlen(mensaje));
	         	exit(-1);
		}


		// ENVIAR KANBAN PRODUCCION A PUERTA
		msg_kproduccion.mtype = MSG_PUERTA_PROD;
		if ( msgsnd(colaI, (m_kanbanproduccion *) &msg_kproduccion, sizeof(m_kanbanproduccion), 0) < 0 )
		{
		        sprintf(mensaje, "Error al encolar el pedido de parte lista a Puertas\n");
			write(fileno(stdout), mensaje, strlen(mensaje));
	         	exit(-1);
		}

		/* Envio Kanban de Produccion a Cabina */
		msg_kproduccion.mtype = MSG_CABINA_PROD;
		if ( msgsnd(colaI, (m_kanbanproduccion *) &msg_kproduccion, sizeof(m_kanbanproduccion), 0) < 0 )
		{
		        sprintf(mensaje, "Error al encolar el pedido de parte lista a Cabina\n");
			write(fileno(stdout), mensaje, strlen(mensaje));

	         	exit(-1);
		}

		printf("cantVehiculos: %d\n", msg_kproduccion.cantVehiculos);
		fentregar = msg_kproduccion.cantVehiculos;
		printf("fentregar: %d\n", fentregar);
		for (producidos=1; producidos <= msg_kproduccion.cantVehiculos; producidos++)
		{
			if ( msgrcv(colaE, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), MSG_ARMADO_PROC, 0) < 0 )
			{
				sprintf(mensaje, "Error al encolar el pedido en PaintShop EntreProcesos\n");
				write(fileno(stdout), mensaje, strlen(mensaje));

				exit(-1);
			}

			printf("cantVehiculos: %d\n", msg_kproduccion.cantVehiculos);
			printf("Armado: Recibi de Paintshop KEntreProcesos\n");
			printf("nroSector: %d\n", msg_kprocesos.nroSector);
			printf("nroVehiculo: %d\n", msg_kprocesos.nroVehiculo);
			printf("codParte: %d\n", msg_kprocesos.codParte);
			printf("nroOrden: %d\n", msg_kprocesos.nroOrden);

			//Solicito las partes para armar la carcaza
			printf("Solicitado caja...\n\n");

			// ENVIAR KANBAN ENTRE PROCESOS A CAJA
			msg_kprocesos.mtype = MSG_CAJA_PROC;

			if ( msgsnd(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), 0) < 0 )
				{
				sprintf(mensaje, "Armado: Error al encolar el pedido a CAJA\n");
				write(fileno(stdout), mensaje, strlen(mensaje));
			       	exit(-1);
			}

			//Solicito las partes para armar la carcaza
			printf("Solicitado puertas...\n\n");

			// ENVIAR KANBAN ENTRE PROCESOS A PUERTA
			msg_kprocesos.mtype = MSG_PUERTA_PROC;

			for (recibidosPuerta=1; recibidosPuerta<=4; recibidosPuerta++)
			{
				msg_kprocesos.nroOrden=+recibidosPuerta;
				if ( msgsnd(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), 0) < 0 )
				{
					sprintf(mensaje, "Error al encolar el pedido a PUERTA\n");
					write(fileno(stdout), mensaje, strlen(mensaje));

					exit(-1);
				}
			}

			//Solicito las partes para armar la carcaza
			printf("Solicitado cabina...\n");
			printf("\n");

			/* Kanban entre procesos a Cabina */
			msg_kprocesos.mtype = MSG_CABINA_PROC;
			if ( msgsnd(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), 0) < 0 )
			{
				sprintf(mensaje, "Error al encolar el pedido a CAJA\n");
				write(fileno(stdout), mensaje, strlen(mensaje));

				exit(-1);
			}

			// RECIBO KANBAN ENTRE PROCESOS DE CAJA
			if ( msgrcv(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), MSG_ARMADO_CAJA, 0) < 0 )
			{
				sprintf(mensaje, "Error al encolar el pedido en PaintShop EntreProcesos\n");
				write(fileno(stdout), mensaje, strlen(mensaje));
				exit(-1);
			}

			printf("Recibi de Caja KEntreProcesos de nroSector: %ld\n", msg_kprocesos.nroSector);
			printf("nroVehiculo %d\n", msg_kprocesos.nroVehiculo);
			printf("codParte %d\n", msg_kprocesos.codParte);
			printf("nroOrden %d\n", msg_kprocesos.nroOrden);
			printf("\n");

			printf("Recibi Caja Nro %d de %d\n", producidos, fentregar);

			// RECIBO KANBAN ENTRE PROCESOS DE PUERTAS
			for (recibidosPuerta=1; recibidosPuerta<=4; recibidosPuerta++)
			{
				if ( msgrcv(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), MSG_ARMADO_PUERTA, 0) < 0 )
				{
					sprintf(mensaje, "Error al recibir el pedido de Puerta EntreProcesos\n");
					write(fileno(stdout), mensaje, strlen(mensaje));
					exit(-1);
				}

				printf("Recibi de Puerta KEntreProcesos de nroSector: %ld\n", msg_kprocesos.nroSector);
				printf("nroVehiculo %d\n", msg_kprocesos.nroVehiculo);
				printf("codParte %d\n", msg_kprocesos.codParte);
				printf("nroOrden %d\n", msg_kprocesos.nroOrden);
				printf("\n");

				printf("Recibi Puerta Nro %d de %d para auto Nro %d\n", producidos, fentregar, msg_kprocesos.nroOrden);
			}

			// RECIBO KANBAN ENTRE PROCESOS DE CABINA
			if ( msgrcv(colaI, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), MSG_ARMADO_CABINA, 0) < 0 )
			{
				sprintf(mensaje, "Error al recibir el pedido en Cabina EntreProcesos\n");
				write(fileno(stdout), mensaje, strlen(mensaje));
				exit(-1);
			}

			printf("Recibi de Cabina KEntreProcesos de nroSector: %ld\n", msg_kprocesos.nroSector);
			printf("nroVehiculo %d\n", msg_kprocesos.nroVehiculo);
			printf("codParte %d\n", msg_kprocesos.codParte);
			printf("nroOrden %d\n", msg_kprocesos.nroOrden);
			printf("\n");

			printf("Recibi Cabina Nro %d de %d\n", producidos, fentregar);

			printf("Tengo las piezas necesarias: Armando auto...\n");
			printf("\n");
			sleep(rand()%10);

			printf("Envio KanbanEntreProcesos a PaintShop (%d)\n\n", pid_Paintshop);

			msg_kprocesos.mtype = pid_Paintshop;
			if ( msgsnd(colaE, (m_kanbanentreprocesos *) &msg_kprocesos, sizeof(m_kanbanentreprocesos), 0) < 0 )
			{
				sprintf(mensaje, "Error al encolar el pedido de parte lista a PaintShop\n");
				write(fileno(stdout), mensaje, strlen(mensaje));

		        	exit(-1);
			}

			printf("Cantidad de veces que se recibio y envio un EntreProcesos %d de %d\n", producidos, fentregar);
			printf("---------------------------------------\n");
		}
		
		sprintf(mensaje, "Estoy listo para recibir otro Kanban de Produccion\n");
		write(fileno(stdout), mensaje, strlen(mensaje));
		// FIN FOR }
	}
}
